﻿using BackData;
using Domain.DTOs.RBAC;
using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Team.API.Applocation.Command.Users;
using Team.API.Applocation.Command.Users.Roles;
using Team.API.Applocation.Command.Users.Permissions;
using Team.API.Applocation.Command.Users.Departments;

namespace Team.API.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private  readonly IMediator mediator;

        public UsersController(IMediator mediator)
        {
            this.mediator = mediator;
        }

        /// <summary>
        /// 新增用户
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<APIResult<UserDTO>> CreateUser(CreateUserCommand request)
        {
            return await mediator.Send(request);
        }

        /// <summary>
        /// 删除用户
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<APIResult<int>> DeleteUser(DeleteUserCommand request)
        {
            return await mediator.Send(request);
        }

        /// <summary>
        /// 用户列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<APIPaging<UserDTO>> GetUsers([FromQuery] QuseyUserCommand request)
        {
            return await mediator.Send(request);
        }

        /// <summary>
        /// 修改用户信息
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<APIResult<UserDTO>> UpdateUser(UpdateUserCommand request)
        {
            return await mediator.Send(request);
        }

        /// <summary>
        /// 更改密码
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<APIResult<int>> UpdateUserPass(UpdateUserPassCommand request)
        {
            return await mediator.Send(request);
        }

        #region 角色管理接口

        /// <summary>
        /// 创建角色
        /// 这个接口用于创建新的角色
        /// 请求方式：POST
        /// 请求路径：/api/Users/CreateRole
        /// </summary>
        /// <param name="request">创建角色的命令对象，包含角色名称</param>
        /// <returns>返回APIResult对象，包含操作结果和创建的角色信息</returns>
        [HttpPost]
        public async Task<APIResult<RoleDTO>> CreateRole(CreateRoleCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            // 这是中介者模式的核心：Controller不需要知道具体的Handler，只需要发送Command即可
            return await mediator.Send(request);
        }

        /// <summary>
        /// 更新角色
        /// 这个接口用于修改已存在角色的信息
        /// 请求方式：POST
        /// 请求路径：/api/Users/UpdateRole
        /// </summary>
        /// <param name="request">更新角色的命令对象，包含角色ID和新的角色名称</param>
        /// <returns>返回APIResult对象，包含操作结果和更新后的角色信息</returns>
        [HttpPost]
        public async Task<APIResult<RoleDTO>> UpdateRole(UpdateRoleCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 删除角色
        /// 这个接口用于删除指定的角色（软删除）
        /// 请求方式：POST
        /// 请求路径：/api/Users/DeleteRole
        /// </summary>
        /// <param name="request">删除角色的命令对象，包含要删除的角色ID</param>
        /// <returns>返回APIResult对象，包含操作结果和受影响的行数</returns>
        [HttpPost]
        public async Task<APIResult<int>> DeleteRole(DeleteRoleCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 查询角色列表
        /// 这个接口用于分页查询角色列表，支持按角色名称模糊搜索
        /// 请求方式：GET
        /// 请求路径：/api/Users/GetRoles
        /// </summary>
        /// <param name="request">查询角色的命令对象，包含分页参数和搜索条件</param>
        /// <returns>返回APIPaging对象，包含分页信息和角色列表数据</returns>
        [HttpGet]
        public async Task<APIPaging<RoleDTO>> GetRoles([FromQuery] QueryRoleCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            // [FromQuery]表示参数从URL查询字符串中获取
            return await mediator.Send(request);
        }

        #endregion

        #region 权限管理接口

        /// <summary>
        /// 创建权限
        /// 这个接口用于创建新的权限
        /// 请求方式：POST
        /// 请求路径：/api/Users/CreatePermission
        /// </summary>
        /// <param name="request">创建权限的命令对象，包含权限名称、路径、父级ID等信息</param>
        /// <returns>返回APIResult对象，包含操作结果和创建的权限信息</returns>
        [HttpPost]
        public async Task<APIResult<PermissionDTO>> CreatePermission(CreatePermissionCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 更新权限
        /// 这个接口用于修改已存在权限的信息
        /// 请求方式：POST
        /// 请求路径：/api/Users/UpdatePermission
        /// </summary>
        /// <param name="request">更新权限的命令对象，包含权限ID和新的权限信息</param>
        /// <returns>返回APIResult对象，包含操作结果和更新后的权限信息</returns>
        [HttpPost]
        public async Task<APIResult<PermissionDTO>> UpdatePermission(UpdatePermissionCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 删除权限
        /// 这个接口用于删除指定的权限（软删除）
        /// 请求方式：POST
        /// 请求路径：/api/Users/DeletePermission
        /// </summary>
        /// <param name="request">删除权限的命令对象，包含要删除的权限ID</param>
        /// <returns>返回APIResult对象，包含操作结果和受影响的行数</returns>
        [HttpPost]
        public async Task<APIResult<int>> DeletePermission(DeletePermissionCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 查询权限列表
        /// 这个接口用于分页查询权限列表，支持按权限名称模糊搜索
        /// 请求方式：GET
        /// 请求路径：/api/Users/GetPermissions
        /// </summary>
        /// <param name="request">查询权限的命令对象，包含分页参数和搜索条件</param>
        /// <returns>返回APIPaging对象，包含分页信息和权限列表数据</returns>
        [HttpGet]
        public async Task<APIPaging<PermissionDTO>> GetPermissions([FromQuery] QueryPermissionCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            // [FromQuery]表示参数从URL查询字符串中获取
            return await mediator.Send(request);
        }

        #endregion

        #region 部门管理接口

        /// <summary>
        /// 创建部门
        /// 这个接口用于创建新的部门
        /// 请求方式：POST
        /// 请求路径：/api/Users/CreateDepartment
        /// </summary>
        /// <param name="request">创建部门的命令对象，包含部门名称、父级ID等信息</param>
        /// <returns>返回APIResult对象，包含操作结果和创建的部门信息</returns>
        [HttpPost]
        public async Task<APIResult<DepartmentDTO>> CreateDepartment(CreateDepartmentCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 更新部门
        /// 这个接口用于修改已存在部门的信息
        /// 请求方式：POST
        /// 请求路径：/api/Users/UpdateDepartment
        /// </summary>
        /// <param name="request">更新部门的命令对象，包含部门ID和新的部门信息</param>
        /// <returns>返回APIResult对象，包含操作结果和更新后的部门信息</returns>
        [HttpPost]
        public async Task<APIResult<DepartmentDTO>> UpdateDepartment(UpdateDepartmentCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 删除部门
        /// 这个接口用于删除指定的部门（软删除）
        /// 请求方式：POST
        /// 请求路径：/api/Users/DeleteDepartment
        /// </summary>
        /// <param name="request">删除部门的命令对象，包含要删除的部门ID</param>
        /// <returns>返回APIResult对象，包含操作结果和受影响的行数</returns>
        [HttpPost]
        public async Task<APIResult<int>> DeleteDepartment(DeleteDepartmentCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            return await mediator.Send(request);
        }

        /// <summary>
        /// 查询部门列表
        /// 这个接口用于分页查询部门列表，支持按部门名称模糊搜索
        /// 请求方式：GET
        /// 请求路径：/api/Users/GetDepartments
        /// </summary>
        /// <param name="request">查询部门的命令对象，包含分页参数和搜索条件</param>
        /// <returns>返回APIPaging对象，包含分页信息和部门列表数据</returns>
        [HttpGet]
        public async Task<APIPaging<DepartmentDTO>> GetDepartments([FromQuery] QueryDepartmentCommand request)
        {
            // 通过中介者模式发送命令，MediatR会自动找到对应的Handler处理
            // [FromQuery]表示参数从URL查询字符串中获取
            return await mediator.Send(request);
        }

        #endregion
    }
}
